JAVA 8 Interface

静态方法


目前为止,通常的做法都是将静态方法放在伴随类中。在标准库中,你会看到成对出现的接口和使用工具类,如Collection/Collections或Path/Paths。在Java SE 8中,允许在接口中增加静态方法,节省一个伴随类,只是这有违于将接口作为抽象规范的初衷。示例如下:

1
2
3
4
5
6
interface MyComparable<T> {
public static <T> int compare(java.lang.Comparable<T> t1, T t2) {
return t1.compareTo(t2);
}
int compareTo(T t);
}

默认方法


可以为接口方法提供一个默认实现。必须用default修饰符标记这样一个方法。

1
2
3
4
5
6
public interface Collection {
int size(); // An abstract method
default boolean isEmpty() {
return size() == 0;
}
}

解决默认方法冲突


如果先在一个接口中将一个方法定义为默认方法,然后又在超类或另一个接口中定义了同样的方法,会发生什么情况?Java的相应规则如下:
1)超类优先。如果超类提供了一个具体方法,同名而且有相同参数类型的默认方法会被忽略。确保与Java SE 7兼容。

1
2
3
4
5
6
7
8
9
10
11
interface Named {
default String getName() {
return getClass().getName() + "_" + hashCode();
}
}
class Person {
public String getName() {
return getClass().getName();
}
}
class Student extends Person implements Named { // super.getName() }

2)接口冲突。如果两个接口都提供了同名同参的默认方法,实现类必须覆盖这个方法类解决冲突。

1
2
3
4
5
6
7
8
9
interface Named {
default String getName() { return "Named:" + getClass().getName() + "_" + hashCode(); }
}
interface Called {
default String getName() { return "Called:" + getClass().getName() + "_" + hashCode(); }
}
class Student implements Named, Called {
public String getName() { return Named.super.getName(); }
}